// C++ Templates 14.2.2 实例化组件（Instantiation Components）

// C++模板实例化是一个复杂的过程，涉及多个组件和步骤。下面我将详细讲解C++模板的实例化组件。

// 实例化组件概述
// 模板实例化（Template Instantiation）是指编译器根据模板定义和提供的模板参数，生成具体的类或函数的过程。实例化组件是参与这个过程的各个部分。

// 主要实例化组件
// 1. 模板定义（Template Definition）
// 这是模板的原始代码，包含泛型参数。例如：
template <typename T>
class Vector
{
private:
    T *elements;
    size_t size;

public:
    Vector(size_t s) : size(s), elements(new T[s]) {}
    T &operator[](size_t i) { return elements[i]; }
    ~Vector() { delete[] elements; }
};

// 2. 模板参数（Template Parameters）
// 这些是在实例化过程中被替换的占位符：
// 类型参数（Type Parameters）：使用typename或class关键字声明
// 非类型参数（Non-type Parameters）：如整数常量
// 模板模板参数（Template Template Parameters）：以模板作为参数的参数

// 3. 模板实参（Template Arguments）
// 这些是在实例化时提供的具体值，用于替换模板参数：
Vector<int> intVector(10); // 这里int是模板实参

// 4. 实例化点（Point of Instantiation）
// 这是编译器决定需要生成模板实例的代码位置。C++标准定义了实例化点的确切规则，通常是在模板被使用的地方之后，但在当前编译单元的末尾之前。

// 5. 实例化上下文（Instantiation Context）
// 实例化发生时的名称查找和访问控制环境。这包括：
//  可见的名称和声明
//  当前的访问权限
//  当前的命名空间
